package com.zy.函数式编程.闭包

object Test {

  def main(args: Array[String]): Unit = {

    // 闭包概念
    // 在下面的例子中，函数的执行顺序为 function5入栈 -> function5出栈 -> function6入栈 -> function6出栈 -> function7入栈 -> function7出栈
    // 在执行function7函数时，无法从作用域内拿到变量i和变量s(因为function5和function6已经出栈)
    // 因为函数也是一个对象，所以function5和function6会在堆内存中存在一个引用，这个引用记录了各项参数，相当于延长了变量的生命周期
    // 这一现象就称为闭包

    def function5(i: Int): String => (Char => Boolean) = {
      def function6(s: String): Char => Boolean = {
        def function7(c: Char): Boolean = {
          if (i == 0 && s.equals("") && c == '0') false else true
        }

        function7
      }

      function6
    }

    println(function5(0)("")('0'))
    println(function5(0)("")('a'))
    println(function5(0)("hello")('0'))


    println("=============================")

    // 具体应用
    // 定义一个函数，对每次传入的值加指定的值
    def addByParam(param: Int): Int => Int = _ + param

    // addByParam执行完毕后作为参数返回，存放在堆内存中(闭包特性)
    val addByFour = addByParam(4)
    // 内部匿名函数直接引用堆内存的函数对象中的变量，完成相加操作
    println(addByFour(2))

    val addByTwo = addByParam(2)
    println(addByTwo(5))


  }

}
